perm filename REDPIC.SAI[VIS,HPM]1 blob
sn#359496 filedate 1978-06-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 procedures for generating and dealing with reduced pictures
C00004 00003 INTEGER PROCEDURE REDDIM(INTEGER HIG,WID,BIT)
C00005 00004 INTEGER PROCEDURE RDFDIM(STRING PICFIL)
C00006 00005 INTEGER PROCEDURE MAKRED(INTEGER HIG,WID,BIT REFERENCE INTEGER REDPIC)
C00008 00006 INTEGER PROCEDURE GETRDF(STRING PICFIL REFERENCE INTEGER REDPIC)
C00010 00007 INTEGER PROCEDURE CAMRED(INTEGER CAMRA,YEDGE,XEDGE
C00012 00008 PROCEDURE FINDIN(REFERENCE INTEGER PIC INTEGER WINDOWSIZE comment interest op
C00024 00009 REAL PROCEDURE SEARCH(REFERENCE INTEGER PIC1,PIC2 comment correlator
C00030 ENDMK
C⊗;
comment procedures for generating and dealing with reduced pictures
a reduced picture array has the format
word 0: NPIC number of pictures in the array
word 1: starting index of picture 1
...
word NPIC: starting index of picture NPIC
word NPIC+1 to EOF: pictures in GUIDE.VIS format ;
INTEGER PROCEDURE REDDIM(INTEGER HIG,WID,BIT);
comment array size needed for set of pictures begining with one of
size HIG x WID x BIT;
BEGIN
INTEGER TSIZ,I,NORD;
TSIZ←PIXDIM(HIG,WID,BIT);
I←WID MIN HIG; NORD←0;
WHILE I>1 DO
BEGIN
NORD←NORD+1; I←I ASH -1;
TSIZ←TSIZ+PIXDIM(HIG ASH -NORD,WID ASH -NORD,(BIT+2*NORD) MIN 9);
END;
RETURN(TSIZ+NORD+1+1);
END;
INTEGER PROCEDURE RDFDIM(STRING PICFIL);
comment array size for reduced picture set begining with pic in PICFIL;
BEGIN
INTEGER ARRAY T[0:10];
IF GETPFD(PICFIL,T[0])≤0 THEN RETURN(0) ELSE
RETURN(REDDIM(T[PCLN],T[LNBY],T[BYBI]));
END;
INTEGER PROCEDURE MAKRED(INTEGER HIG,WID,BIT; REFERENCE INTEGER REDPIC);
comment make a skeleton array of reduced pictures whose first member
is of size HIG x WID x PIC;
BEGIN
INTEGER I,J,NORD,NPIC;
I←WID MIN HIG; NORD←0;
WHILE I>1 DO
BEGIN
NORD←NORD+1; I←I ASH -1;
END;
NPIC←NORD+1;
MEMORY[LOCATION(REDPIC) ]←NPIC;
MEMORY[LOCATION(REDPIC)+1]←NPIC+1;
MAKPIX(HIG,WID,BIT,MEMORY[LOCATION(REDPIC)+NPIC+1]);
J←NPIC+1+PIXDIM(HIG,WID,BIT);
FOR I←1 STEP 1 UNTIL NORD DO
BEGIN
MEMORY[LOCATION(REDPIC)+I+1]←J;
J←J+PIXDIM(HIG ASH -I,WID ASH -I,(BIT+2*I) MIN 9);
MAKPIX(HIG ASH -I,WID ASH -I,(BIT+2*I) MIN 9,
MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I+1]]);
END;
RETURN(J);
END;
INTEGER PROCEDURE GETRDF(STRING PICFIL; REFERENCE INTEGER REDPIC);
comment read in a picture file, and make a set of reductions of it;
BEGIN
INTEGER ARRAY T[0:10];
INTEGER I,J,NORD,NPIC, HIG,WID,BIT;
IF GETPFD(PICFIL,T[0])≤0 THEN RETURN(0);
HIG←T[PCLN]; WID←T[LNBY]; BIT←T[BYBI];
I←WID MIN HIG; NORD←0;
WHILE I>1 DO
BEGIN
NORD←NORD+1; I←I ASH -1;
END;
NPIC←NORD+1;
MEMORY[LOCATION(REDPIC) ]←NPIC;
MEMORY[LOCATION(REDPIC)+1]←NPIC+1;
GETPFL(PICFIL,MEMORY[LOCATION(REDPIC)+NPIC+1]);
J←NPIC+1+PIXDIM(HIG,WID,BIT);
FOR I←1 STEP 1 UNTIL NORD DO
BEGIN
MEMORY[LOCATION(REDPIC)+I+1]←J;
J←J+PIXDIM(HIG ASH -I,WID ASH -I,(BIT+2*I) MIN 9);
HAFPIC(MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I ]],
MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I+1]], 9);
END;
RETURN(J);
END;
INTEGER PROCEDURE CAMRED(INTEGER CAMRA,YEDGE,XEDGE;
REFERENCE INTEGER PIC;
INTEGER SUMS(1),BCLIP(7),TCLIP(0),NTRY(10));
comment read in a picture from a camera, and make a set of reductions of it;
BEGIN
INTEGER I,NORD,NPIC,RETRY;
NPIC←PIC; NORD←NPIC-1;
RETRY←CAMPIX(CAMRA,YEDGE,XEDGE,MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+1]],
SUMS,BCLIP,TCLIP,NTRY);
FOR I←1 STEP 1 UNTIL NORD DO
HAFPIC(MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I ]],
MEMORY[LOCATION(REDPIC)+MEMORY[LOCATION(REDPIC)+I+1]], 9);
RETURN(RETRY);
END;
PROCEDURE FINDIN(REFERENCE INTEGER PIC; INTEGER WINDOWSIZE; comment interest op;
REFERENCE INTEGER NFS; REFERENCE REAL FY,FX);
comment applies the local max of minimum directional variance interest
operator to produce a list of interesting points in arrays
FY and FX, sorted in order of decreasing variance. NFS
is initialized to maximum number of features, is set by
procedure to actual number found;
BEGIN
INTEGER IORD,HIG,WID,BIT,IW,HW;
IORD←0; WHILE (WINDOWSIZE ASH -(IORD+1))≥2 DO IORD←IORD+1;
IW←WINDOWSIZE ASH -IORD;
HW←(IW+1)%2;
IW←2*HW;
HIG←MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]+PCLN];
WID←MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]+LNBY];
BIT←MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]+BYBI];
BEGIN
INTEGER IAV,I,J,K,AH,AW,FHAV,AWR,AHR;
SAFE INTEGER ARRAY
INTER[ 0 : AH ← (HIG-HW-1)%IW + (HIG-1)%IW - 1,
0 : AW ← (WID-HW-1)%IW + (WID-1)%IW - 1 ];
REAL ARRAY FXV,FYV,FIV[1:NFS];
BEGIN
INTEGER AH,AW;
SAFE INTEGER ARRAY I00[-2:AH←(HIG-1)%IW-1, 0:AW←(WID-1)%IW-1];
IAV←INTOP(MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]],
IW,I00[0,0],0,0);
FOR I←0 STEP 1 UNTIL AH DO
FOR J←0 STEP 1 UNTIL AW DO
INTER[I*2,J*2]←I00[I,J];
END;
BEGIN
INTEGER AH,AW;
SAFE INTEGER ARRAY I10[-2:AH←(HIG-HW-1)%IW-1, 0:AW←(WID-1)%IW-1];
IAV←IAV+INTOP(MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]],
IW,I10[0,0],HW,0);
FOR I←0 STEP 1 UNTIL AH DO
FOR J←0 STEP 1 UNTIL AW DO
INTER[I*2+1,J*2]←I10[I,J];
END;
BEGIN
INTEGER AH,AW;
SAFE INTEGER ARRAY I01[-2:AH←(HIG-1)%IW-1, 0:AW←(WID-HW-1)%IW-1];
IAV←IAV+INTOP(MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]],
IW,I01[0,0],0,HW);
FOR I←0 STEP 1 UNTIL AH DO
FOR J←0 STEP 1 UNTIL AW DO
INTER[I*2,J*2+1]←I01[I,J];
END;
BEGIN
INTEGER AH,AW;
SAFE INTEGER ARRAY I11[-2:AH←(HIG-HW-1)%IW-1, 0:AW←(WID-HW-1)%IW-1];
IAV←IAV+INTOP(MEMORY[LOCATION(PIC)+MEMORY[LOCATION(PIC)+IORD+1]],
IW,I11[0,0],HW,HW);
FOR I←0 STEP 1 UNTIL AH DO
FOR J←0 STEP 1 UNTIL AW DO
INTER[I*2+1,J*2+1]←I11[I,J];
END;
IAV←IAV%32;
INTLOM(AH+1,AW+1,INTER[0,0]); comment flag local maxima;
FHAV←0;
FOR I←1 STEP 1 UNTIL AH-2 DO
FOR J←1 STEP 1 UNTIL AW-1 DO
IF (INTER[I,J] LAND 1)=1 ∧ INTER[I,J]>IAV THEN
BEGIN
REAL FXT,FYT,FIT;
INTEGER L,H,M;
FYT←((I+1)*HW+.5)/HIG;
FXT←((J+1)*HW+.5)/WID;
FIT←INTER[I,J];
L←1; H←FHAV;
WHILE L≤H DO IF FIT>FIV[M←(L+H)%2] THEN H←M-1 ELSE L←M+1;
FHAV←(FHAV+1) MIN NFS;
IF L≤FHAV THEN
BEGIN
FOR M←FHAV-1 STEP -1 UNTIL L DO
BEGIN
FXV[M+1]←FXV[M]; FYV[M+1]←FYV[M]; FIV[M+1]←FIV[M];
END;
FXV[L]←FXT; FYV[L]←FYT; FIV[L]←FIT;
END;
END;
FOR I←1 STEP 1 UNTIL FHAV DO
BEGIN
MEMORY[LOCATION(FX)-1+I,REAL]←FXV[I];
MEMORY[LOCATION(FY)-1+I,REAL]←FYV[I];
END;
NFS←FHAV;
END;
END;
REAL PROCEDURE SEARCH(REFERENCE INTEGER PIC1,PIC2; comment correlator;
INTEGER WINDOWSIZE;
REFERENCE REAL POSY,POSX;
REAL DY1(0),DX1(0),DY2(1),DX2(1) );
COMMENT applies the binary search correlation method to find a window
centered about POSX,POSY in PIC1 (defined to be 0 to 1 in X and Y),
and of size WINDOWSIZE pixels square in the whole of PIC2. PIC1
and PIC2 are reduced picture sets. The best match in PIC2 is returned
in POSX and POSY, the value of the match (0 to 1) is the value of SEARCH.
The search can be constrained to the rectangle bounded by DY1,DX1,
DY2,DX2 (all 0 to 1) if desired;
BEGIN
INTEGER IL,JL,IH,JH,WID,HIG,NORD,I,J,K,L,M,N; REAL QUAL;
REAL PXF,PYF;
INTEGER ILT,JLT,IHT,JHT,
ILS,JLS,IHS,JHS,
ISC,JSC,ITC,JTC,
ISS,JSS,ITS,JTS;
REAL QUALT,PXFT,PYFT;
BOOLEAN PROCEDURE TRYRED(INTEGER MS,MT);
BEGIN
BOOLEAN ANS;
ANS←FALSE;
IF QUALT<.8 THEN
BEGIN
REAL PXFTT,PYFTT,QUALTT,QUATTT;
INTEGER WISH; BOOLEAN LOSE;
ISC←(ISS←MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+MS+1]+PCLN])*POSY;
JSC←(JSS←MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+MS+1]+LNBY])*POSX;
ITC←(ITS←MEMORY[LOCATION(PIC2)+MEMORY[LOCATION(PIC2)+MT+1]+PCLN])*PYF;
JTC←(JTS←MEMORY[LOCATION(PIC2)+MEMORY[LOCATION(PIC2)+MT+1]+LNBY])*PXF;
WISH←WINDOWSIZE; QUALTT←0;
DO
BEGIN
LOSE←TRUE;
WISH←WISH%2;
JLS←JSC-WISH;
ILS←ISC-WISH;
JHS←JSC+WISH;
IHS←ISC+WISH;
JLT←(JTC-WINDOWSIZE) MAX (JTS*DX1-WISH-1);
ILT←(ITC-WINDOWSIZE) MAX (ITS*DY1-WISH-1);
JHT←(JTC+WINDOWSIZE) MIN (JTS*DX2+WISH+1);
IHT←(ITC+WINDOWSIZE) MIN (ITS*DY2+WISH+1);
QUATTT←NORCOR(MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+MS+1]],
ILS,JLS,IHS,JHS,
MEMORY[LOCATION(PIC2)+MEMORY[LOCATION(PIC2)+MT+1]],
ILT,JLT,IHT,JHT);
IF QUATTT>QUALTT THEN
BEGIN
PXFTT←0.5*(JLT+JHT)/JTS;
PYFTT←0.5*(ILT+IHT)/ITS;
QUALTT←QUATTT;
LOSE←FALSE;
END;
END
UNTIL QUALTT≥.65 ∨ WISH≤1 ∨ LOSE;
SETFORMAT(0,3);
IF QUALTT>QUALT THEN
BEGIN
QUALT←QUALTT;
PXFT←PXFTT;
PYFT←PYFTT;
ANS←TRUE;
END;
RETURN(ANS);
END;
END;
IF DX1>DX2 THEN DX1↔DX2;
IF DY1>DY2 THEN DY1↔DY2;
IF DX1≥1∨DX2≤0∨DY1≥1∨DY2≤0 THEN RETURN(0);
DX1←DX1 MAX 0; DX2←DX2 MIN 1; DY1←DY1 MAX 0; DY2←DY2 MIN 1;
WID←MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+1]+LNBY]*ABS(DX2-DX1);
HIG←MEMORY[LOCATION(PIC1)+MEMORY[LOCATION(PIC1)+1]+PCLN]*ABS(DY2-DY1);
NORD←0;
WHILE WINDOWSIZE≤(WID MIN HIG)/2↑(NORD+1) DO NORD←NORD+1;
PXF←(DX1+DX2)/2; PYF←(DY1+DY2)/2;
QUAL←1;
FOR M←NORD STEP -1 UNTIL 0 DO
BEGIN
QUALT←-1.0;
TRYRED(M,M);
PXF←PXFT;
PYF←PYFT;
QUAL←QUAL MIN QUALT;
END;
POSX←PXF; POSY←PYF;
RETURN(QUAL);
END;